#pragma once

#include<string.h>
#include<list>

#define _DEF_UDP_PORT		(8080)
#define _DEF_BUFFER_SIZE	(4096)
#define _DEF_NAME_SIZE		(60)
#define _DEF_CONTENT_SIZE	(1024)
#define _DEF_MAX_SIZE		(100)
//协议映射表大小
#define _DEF_PROTOCAL_COUNT (100)

#define _DEF_TCP_PORT	(54321)
#define _DEF_TCP_SERVER_IP	("192.168.31.136")


//协议头
#define _DEF_PROTOCAL_BASE	(10000)

//---TCP------
 //注册
#define _DEF_TCP_REGISTER_RQ	(_DEF_PROTOCAL_BASE+10)
#define _DEF_TCP_REGISTER_RS	(_DEF_PROTOCAL_BASE+11)
//登录
#define _DEF_TCP_LOGIN_RQ		(_DEF_PROTOCAL_BASE+12)
#define _DEF_TCP_LOGIN_RS		(_DEF_PROTOCAL_BASE+13)
//好友信息
#define _DEF_TCP_FRIEND_INFO	(_DEF_PROTOCAL_BASE+14)
//添加好友
#define _DEF_TCP_ADD_FRIEND_RQ	(_DEF_PROTOCAL_BASE+15)
#define _DEF_TCP_ADD_FRIEND_RS	(_DEF_PROTOCAL_BASE+16)
//聊天
#define _DEF_TCP_CHAT_RQ		(_DEF_PROTOCAL_BASE+17)
#define _DEF_TCP_CHAT_RS		(_DEF_PROTOCAL_BASE+18)
//下线
#define _DEF_TCP_OFFLINE		(_DEF_PROTOCAL_BASE+19)
//文件信息
#define _DEF_PROTOCAL_FILE_INFO_RQ (_DEF_PROTOCAL_BASE + 20)
#define _DEF_PROTOCAL_FILE_INFO_RS (_DEF_PROTOCAL_BASE + 21)
//文件块
#define _DEF_PROTOCAL_FILE_BLOCK_RQ (_DEF_PROTOCAL_BASE + 22)
#define _DEF_PROTOCAL_FILE_BLOCK_RS (_DEF_PROTOCAL_BASE + 23)
#define _MAX_FILE_PATH  (512)
#define _DEF_FILE_CONTENT_SIZE (8*1024)
//添加群聊
#define _DEF_TCP_ADD_GROUP_RQ	(_DEF_PROTOCAL_BASE+24)
#define _DEF_TCP_ADD_GROUP_RS	(_DEF_PROTOCAL_BASE+25)
//群聊属性
#define _DEF_TCP_GROUP_INFO     (_DEF_PROTOCAL_BASE+26)
//群聊发送消息
#define _DEF_SEND_GROUP_MSG_RQ  (_DEF_PROTOCAL_BASE + 27)
#define _DEF_SEND_GROUP_MSG_RS  (_DEF_PROTOCAL_BASE + 28)
//群聊邀请好友
#define _DEF_GROUP_INVITE_RQ    (_DEF_PROTOCAL_BASE+29)
#define _DEF_GROUP_INVITE_RS    (_DEF_PROTOCAL_BASE+30)
//退出群聊
#define _DEF_EXIT_GROUP_RQ      (_DEF_PROTOCAL_BASE+31)
//删除好友
#define _DEF_DEL_FRIEND_RQ      (_DEF_PROTOCAL_BASE+32)
//群聊好友列表
#define _DEF_GROUP_LIST_RQ      (_DEF_PROTOCAL_BASE+33)
//群聊好友info
#define _DEF_GROUP_LIST_INFO    (_DEF_PROTOCAL_BASE+34)

//返回结果
//注册请求的返回结果
#define register_success	(0)
#define user_is_exist		(1)
#define parameter_error		(2)
#define register_fail		(3)
//登录请求的返回结果
#define login_success		(0)
#define password_error		(1)
#define	user_not_exist		(2)
//添加好友的返回结果
#define add_success		(0)
#define no_this_exist	(1)
#define user_refuse		(2)
#define user_offline	(3)
#define add_fail		(4)
//聊天信息的发送结果
#define	send_success	(0)
#define	send_error		(1)
//好友状态
#define	status_online	(0)
#define	status_offline	(1)

//文件请求结果
#define _file_accept (0)
#define _file_refuse (1)
//文件块的接收结果
#define _file_block_recv_success (0)
#define _file_block_recv_fail   (1)

//*----------TCP---------
typedef int PackType;
//注册请求，协议头、昵称、密码、手机号
typedef struct STRU_TCP_REGISTER_RQ
{
	STRU_TCP_REGISTER_RQ() :type(_DEF_TCP_REGISTER_RQ)
	{
		memset(name, 0, _DEF_MAX_SIZE);
		memset(tel, 0, _DEF_MAX_SIZE);
		memset(password, 0, _DEF_MAX_SIZE);
	}

	PackType type;
	char name[_DEF_MAX_SIZE];
	char tel[_DEF_MAX_SIZE];
	char password[_DEF_MAX_SIZE];
}STRU_TCP_REGISTER_RQ;

//注册回复，协议头
typedef struct STRU_TCP_REGISTER_RS
{
    STRU_TCP_REGISTER_RS() :type(_DEF_TCP_REGISTER_RS), result(register_success)
	{}
	PackType type;
	int result;
}STRU_TCP_REGISTER_RS;

//登录请求，协议头，电话号码，密码
typedef struct STRU_TCP_LOGIN_RQ
{
	STRU_TCP_LOGIN_RQ() :type(_DEF_TCP_LOGIN_RQ)
	{
		memset(tel, 0, _DEF_MAX_SIZE);
		memset(password, 0, _DEF_MAX_SIZE);
	}
	PackType type;
	char tel[_DEF_MAX_SIZE];
	char password[_DEF_MAX_SIZE];
}STRU_TCP_LOGIN_RQ;
//登录回复。协议头、登录结果 、用户id
typedef struct STRU_TCP_LOGIN_RS
{
	STRU_TCP_LOGIN_RS() :type(_DEF_TCP_LOGIN_RS), result(login_success), userId(0)
	{}
	PackType type;
	int result;
	int userId;
}STRU_TCP_LOGIN_RS;

//好友信息,协议头、昵称、用户状态、签名、头像、用户id
typedef struct STRU_TCP_FRIEND_INFO
{
	STRU_TCP_FRIEND_INFO() :type(_DEF_TCP_FRIEND_INFO), state(status_online), iconId(0), userId(0)
	{
		memset(name, 0, _DEF_MAX_SIZE);
		memset(feeling, 0, _DEF_MAX_SIZE);
	}
	PackType type;
	char name[_DEF_MAX_SIZE];
	char feeling[_DEF_MAX_SIZE];
	int state;
	int iconId;
	int userId;
}STRU_TCP_FRIEND_INFO;
//添加好友请求，协议头，用户id、用户昵称、被添加用户的昵称
typedef struct STRU_TCP_ADD_FRIEND_RQ
{
	STRU_TCP_ADD_FRIEND_RQ() :type(_DEF_TCP_ADD_FRIEND_RQ), userId(0)
	{
		memset(userName, 0, _DEF_MAX_SIZE);
		memset(friendName, 0, _DEF_MAX_SIZE);
	}
	PackType type;
	int userId;
	char userName[_DEF_MAX_SIZE];
	char friendName[_DEF_MAX_SIZE];
}STRU_TCP_ADD_FRIEND_RQ;
//添加好友回复，协议头，添加结果、被添加用户的昵称、被添加用户的id
typedef struct STRU_TCP_ADD_FRIEND_RS
{
	STRU_TCP_ADD_FRIEND_RS() :type(_DEF_TCP_ADD_FRIEND_RS), result(add_success), friendId(0), userId(0)
	{
		memset(friendName, 0, _DEF_MAX_SIZE);
	}
	PackType type;
	int result;
	int friendId;
	int userId;
	char friendName[_DEF_MAX_SIZE];
}STRU_TCP_ADD_FRIEND_RS;

//添加群聊请求，协议头，用户id、用户昵称、添加群聊的昵称
typedef struct STRU_TCP_ADD_GROUP_RQ
{
    STRU_TCP_ADD_GROUP_RQ() :type(_DEF_TCP_ADD_GROUP_RQ), userId(0)
    {
        memset(userName, 0, _DEF_MAX_SIZE);
        memset(groupName, 0, _DEF_MAX_SIZE);
    }
    PackType type;
    int userId;
    char userName[_DEF_MAX_SIZE];
    char groupName[_DEF_MAX_SIZE];
}STRU_TCP_ADD_GROUP_RQ;
//添加群聊回复，协议头，添加结果、用户的昵称、用户的id、群组名称
typedef struct STRU_TCP_ADD_GROUP_RS
{
    STRU_TCP_ADD_GROUP_RS():type(_DEF_TCP_ADD_GROUP_RS), result(add_success), userId(0)
    {
        memset(userName, 0, _DEF_MAX_SIZE);
        memset(groupName, 0, _DEF_MAX_SIZE);
    }
    PackType type;
    int result;
    int userId;
    char groupName[_DEF_MAX_SIZE];
    char userName[_DEF_MAX_SIZE];
}STRU_TCP_ADD_GROUP_RS;
//群聊的信息
typedef struct STRU_GROUP_INFO
{
    STRU_GROUP_INFO():type(_DEF_TCP_GROUP_INFO),id(0)
    {
        memset(groupName, 0, _DEF_MAX_SIZE);
    }
    PackType type;
    int id;
    char groupName[_DEF_MAX_SIZE];
}STRU_GROUP_INFO;

//聊天请求，协议头，聊天内容，接收者的id，发送者的id
typedef struct STRU_TCP_CHAT_RQ
{
	STRU_TCP_CHAT_RQ() :type(_DEF_TCP_CHAT_RQ), userId(0), friendId(0)
	{
		memset(content, 0, _DEF_CONTENT_SIZE);
	}
	PackType type;
	int userId;
	int friendId;
	char content[_DEF_CONTENT_SIZE];
}STRU_TCP_CHAT_RQ;
//聊天回复，协议头，发送结果，接收者id，发送者的id
typedef struct STRU_TCP_CHAT_RS
{
	STRU_TCP_CHAT_RS() :type(_DEF_TCP_CHAT_RS), userId(0), friendId(0), result(send_success)
	{}
	PackType type;
	int userId;
	int friendId;
	int result;
}STRU_TCP_CHAT_RS;
//下线
typedef struct STRU_TCP_OFFLINE_RQ {
	STRU_TCP_OFFLINE_RQ() :type(_DEF_TCP_OFFLINE), userId(0)
	{}
	PackType type;
	int userId;
}STRU_TCP_OFFLINE_RQ;
//文件信息请求
struct STRU_FILE_INFO_RQ    //协议头，文件标志，文件名，文件大小
{
    STRU_FILE_INFO_RQ():nType(_DEF_PROTOCAL_FILE_INFO_RQ),szFileSize(0),userid(0),friendid(0){
        memset(szFileID,0,_MAX_FILE_PATH);
        memset(szFileName,0,_MAX_FILE_PATH);
        memset(szFilePath,0,_MAX_FILE_PATH);
    }
    int nType;
    char szFileID[_MAX_FILE_PATH];
    char szFileName[_MAX_FILE_PATH];
    char szFilePath[_MAX_FILE_PATH];
    long long szFileSize;
    int userid;
    int friendid;
};
//文件信息回复
struct STRU_FILE_INFO_RS    //协议头 文件标志 结果
{
    STRU_FILE_INFO_RS():nType(_DEF_PROTOCAL_FILE_INFO_RS),nRes(_file_accept),userid(0),friendid(0),szFileSize(0){
        memset(szFileID,0,_MAX_FILE_PATH);
        memset(szFilePath,0,_MAX_FILE_PATH);
    }
    int nType;
    char szFileID[_MAX_FILE_PATH];
    char szFilePath[_MAX_FILE_PATH];
    long long szFileSize;
    int nRes;
    int userid;
    int friendid;
};
//文件块的请求
struct STRU_FILE_BLOCK_RQ   //协议头，文件标志， 文件块 块大小
{
    STRU_FILE_BLOCK_RQ():nType(_DEF_PROTOCAL_FILE_BLOCK_RQ),nBlockSize(0),userid(0),friendid(0){
        memset(szFileID,0,_MAX_FILE_PATH);
        memset(szFileContent,0,_DEF_FILE_CONTENT_SIZE);
    }
    int nType;
    char szFileID[_MAX_FILE_PATH];
    char szFileContent[_DEF_FILE_CONTENT_SIZE];
    int nBlockSize;
    int userid;
    int friendid;
};
//文件块的回复
struct STRU_FILE_BLOCK_RS   //协议头，文件标志，结果
{
    STRU_FILE_BLOCK_RS():nType(_DEF_PROTOCAL_FILE_BLOCK_RS),nRes(_file_block_recv_success){
        memset(szFileID,0,_MAX_FILE_PATH);
    }
    int nType;
    char szFileID[_MAX_FILE_PATH];
    int nRes;
};
//文件信息
struct FileInfo //做接受使用 跨函数 ： 文件标志 ，文件名 ，文件路径，当前位置，总大小，文件指针
{
    FileInfo():nPos(0),nFileSize(0),pFile(NULL){
        memset(szFileID,0,_MAX_FILE_PATH);
        memset(szFileName,0,_MAX_FILE_PATH);
        memset(szFilePath,0,_MAX_FILE_PATH);
    }
    char szFileID[_MAX_FILE_PATH];
    char szFileName[_MAX_FILE_PATH];
    char szFilePath[_MAX_FILE_PATH];
    long long nPos;         //当前是在什么位置
    long long nFileSize;    //文件总共多大
    FILE * pFile;           //文件指针
};
//群聊发消息请求，
typedef struct STRU_GROUP_MSG_RQ
{
    STRU_GROUP_MSG_RQ() :type(_DEF_SEND_GROUP_MSG_RQ), userId(0), groupId(0)
    {
        memset(content, 0, _DEF_CONTENT_SIZE);
        memset(name, 0, _DEF_CONTENT_SIZE);
    }
    PackType type;
    int userId;
    int groupId;
    char content[_DEF_CONTENT_SIZE];
    char name[_DEF_CONTENT_SIZE];
}STRU_GROUP_MSG_RQ;
//群聊发消息回复
typedef struct STRU_GROUP_MSG_RS
{
    STRU_GROUP_MSG_RS() :type(_DEF_SEND_GROUP_MSG_RS), userId(0), groupId(0), result(send_success)
    { }
    PackType type;
    int userId;
    int groupId;
    int result;
}STRU_GROUP_MSG_RS;
//群聊邀请好友请求
typedef struct STRU_GROUP_INVITE_RQ
{
    STRU_GROUP_INVITE_RQ():type(_DEF_GROUP_INVITE_RQ),groupId(0){
        memset(userName, 0, _DEF_MAX_SIZE);
        memset(groupName, 0, _DEF_MAX_SIZE);
    }
    PackType type;
    int groupId;
    char userName[_DEF_MAX_SIZE];
    char groupName[_DEF_MAX_SIZE];
}STRU_GROUP_INVITE_RQ;
//群聊邀请好友回复
typedef struct STRU_GROUP_INVITE_RS
{
    STRU_GROUP_INVITE_RS():type(_DEF_GROUP_INVITE_RS),groupid(0),result(add_success){}
    PackType type;
    int groupid;
    int result;
}STRU_GROUP_INVITE_RS;
//退出群聊
typedef struct STRU_EXIT_GROUP_RQ
{
    STRU_EXIT_GROUP_RQ():type(_DEF_EXIT_GROUP_RQ),groupId(0),userId(0){

    }
    PackType type;
    int groupId;
    int userId;
}STRU_EXIT_GROUP_RQ;
//删除好友
typedef struct STRU_DEL_FRIEND_RQ
{
    STRU_DEL_FRIEND_RQ():type(_DEF_DEL_FRIEND_RQ),m_id(0),friendId(0){

    }
    PackType type;
    int m_id;
    int friendId;
}STRU_DEL_FRIEND_RQ;
//群聊好友列表
typedef struct STRU_GROUP_LIST_RQ
{
    STRU_GROUP_LIST_RQ():type(_DEF_GROUP_LIST_RQ),userId(0),friendId(0),groupId(0){
        memset(userName, 0, _DEF_MAX_SIZE);
    }
    PackType type;
    int userId;
    int friendId;
    int groupId;
    char userName[_DEF_MAX_SIZE];

}STRU_GROUP_LIST_RQ;
//群聊好友info
typedef struct STRU_GROUP_LIST_INFO
{
    STRU_GROUP_LIST_INFO():type(_DEF_GROUP_LIST_INFO),userId(0),friendId(0),groupId(0){
        memset(userName, 0, _DEF_MAX_SIZE);
    }
    PackType type;
    int userId;
    int friendId;
    int groupId;
    char userName[_DEF_MAX_SIZE];
}STRU_GROUP_LIST_INFO;
